நியூடைப், டைப்வேர் மற்றும் பொதுவான தடைகளுடன் கூடிய மேம்பட்ட பைத்தான் டைப்பிங்கின் ஆழமான பகுப்பாய்வு. வலுவான, படிக்கக்கூடிய மற்றும் பராமரிக்கக்கூடிய பயன்பாடுகளை உருவாக்க கற்றுக்கொள்ளுங்கள்.
பைத்தானின் டைப்பிங் நீட்டிப்புகளை மாஸ்டர் செய்வது: நியூடைப், டைப்வேர் மற்றும் பொதுவான தடைகளுக்கான ஒரு வழிகாட்டி
நவீன மென்பொருள் மேம்பாட்டு உலகில், செயல்பாட்டுடன் மட்டுமல்லாமல் தெளிவான, பராமரிக்கக்கூடிய மற்றும் வலுவான குறியீட்டை எழுதுவது மிக முக்கியமானது. பாரம்பரியமாக டைனமிக் டைப் செய்யப்பட்ட மொழியான பைத்தான், PEP 484 இல் அறிமுகப்படுத்தப்பட்ட அதன் சக்திவாய்ந்த டைப்பிங் அமைப்பு மூலம் இந்த தத்துவத்தை ஏற்றுக்கொண்டது. int
, str
மற்றும் list
போன்ற அடிப்படை வகை குறிப்புகள் இப்போது வழக்கமானதாகிவிட்டாலும், பைத்தானின் டைப்பிங்கின் உண்மையான சக்தி அதன் மேம்பட்ட அம்சங்களில் உள்ளது. இந்த கருவிகள் டெவலப்பர்கள் சிக்கலான உறவுகள் மற்றும் தடைகளை வெளிப்படுத்த அனுமதிக்கின்றன, இது பாதுகாப்பான மற்றும் சுய-ஆவணப்படுத்தப்பட்ட குறியீட்டிற்கு வழிவகுக்கிறது.
இந்தக் கட்டுரை typing
தொகுதியின் மிகவும் தாக்கமான அம்சங்களில் மூன்று அம்சங்களை ஆழமாக ஆராய்கிறது: NewType
, TypeVar
மற்றும் அவற்றிற்குப் பயன்படுத்தக்கூடிய தடைகள். இந்த கருத்துக்களை மாஸ்டர் செய்வதன் மூலம், உங்கள் பைத்தான் குறியீட்டை வெறுமனே செயல்பாட்டு நிலையிலிருந்து தொழில்ரீதியாக வடிவமைக்கப்பட்டதாக உயர்த்தலாம், மேலும் அவை உற்பத்திக்கு வருவதற்கு முன்பே நுட்பமான பிழைகளை நீங்கள் பிடிக்கலாம்.
ஏன் மேம்பட்ட டைப்பிங் முக்கியமானது
குறிப்பிட்ட விவரங்களை ஆராய்வதற்கு முன், அடிப்படை வகைகளைத் தாண்டிச் செல்வது ஏன் ஒரு விளையாட்டு மாற்றியாக இருக்கிறது என்பதை நிறுவுவோம். பெரிய அளவிலான பயன்பாடுகளில், எளிய பழமையான வகைகள் பெரும்பாலும் அவை பிரதிநிதித்துவப்படுத்தும் தரவின் முழுமையான சொற்பொருள் பொருளைப் பிடிக்கத் தவறிவிடுகின்றன. ஒரு int
ஒரு பயனர் ஐடியா, ஒரு தயாரிப்பு எண்ணிக்கையா அல்லது மீட்டரில் அளவீடா? சூழல் இல்லாமல், அவை எண்கள் மட்டுமே, மேலும் கம்பைலர் அல்லது மொழிபெயர்ப்பாளர் ஒருவர் எதிர்பார்க்கப்படும் இடத்தில் நீங்கள் தற்செயலாக ஒன்றைப் பயன்படுத்துவதைத் தடுக்க முடியாது.
மேம்பட்ட டைப்பிங், இந்த வணிக தர்க்கத்தையும் கள அறிவையும் உங்கள் குறியீட்டின் கட்டமைப்பிற்குள் நேரடியாக உட்பொதிக்க ஒரு வழியை வழங்குகிறது. இது வழிவகுக்கிறது:
- மேம்படுத்தப்பட்ட குறியீடு தெளிவு: வகைகள் ஆவணமாக்கலின் ஒரு வடிவமாக செயல்படுகின்றன, இது செயல்பாட்டின் கையொப்பங்களை உடனடியாகப் புரிந்துகொள்ள வைக்கிறது.
- மேம்படுத்தப்பட்ட IDE ஆதரவு: VS Code, PyCharm மற்றும் பிற கருவிகள் மிகவும் துல்லியமான தானியங்கு நிறைவு, மறுசீரமைப்பு ஆதரவு மற்றும் நிகழ்நேர பிழை கண்டறிதல் ஆகியவற்றை வழங்க முடியும்.
- ஆரம்ப பிழை கண்டறிதல்: Mypy, Pyright அல்லது Pyre போன்ற நிலையான வகை சரிபார்ப்புகள் உங்கள் குறியீட்டை பகுப்பாய்வு செய்து மேம்பாட்டின் போது சாத்தியமான இயக்க நேர பிழைகளின் முழு வகுப்பையும் அடையாளம் காண முடியும்.
- அதிக பராமரிப்பு: ஒரு குறியீட்டுத் தளம் வளரும்போது, வலுவான டைப்பிங் புதிய டெவலப்பர்கள் கணினியின் வடிவமைப்பைப் புரிந்துகொள்வதையும் நம்பிக்கையுடன் மாற்றங்களைச் செய்வதையும் எளிதாக்குகிறது.
இப்போது, எங்கள் முதல் கருவியை ஆராய்வதன் மூலம் இந்த சக்தியைத் திறப்போம்: NewType
.
நியூடைப்: சொற்பொருள் பாதுகாப்பிற்கான தனித்துவமான வகைகளை உருவாக்குதல்
சிக்கல்: பழமையான வெறி
மென்பொருள் மேம்பாட்டில் ஒரு பொதுவான எதிர்-முறை "பழமையான வெறி" - களம் சார்ந்த கருத்துகளை பிரதிநிதித்துவப்படுத்த உள்ளமைக்கப்பட்ட பழமையான வகைகளை அதிகமாகப் பயன்படுத்துதல். பயனர் மற்றும் ஆர்டர் தகவலைக் கையாளும் ஒரு அமைப்பைக் கவனியுங்கள்:
def process_order(user_id: int, order_id: int) -> None:
print(f"Processing order {order_id} for user {user_id}...")
# A simple, but potentially disastrous, mistake
user_identification = 101
order_identification = 4512
process_order(order_identification, user_identification) # Whoops!
# Output: Processing order 101 for user 4512...
மேலே உள்ள எடுத்துக்காட்டில், நாங்கள் தற்செயலாக user_id
மற்றும் order_id
ஐ மாற்றியுள்ளோம். இரண்டும் முழு எண்கள் என்பதால் பைத்தான் புகார் செய்யாது. அதே காரணத்திற்காக ஒரு நிலையான வகை சரிபார்ப்பும் அதைப் பிடிக்காது. இத்தகைய பிழை வஞ்சகமானதாக இருக்கலாம், இது சிதைந்த தரவு அல்லது தவறான வணிக நடவடிக்கைகளுக்கு வழிவகுக்கும்.
தீர்வு: `NewType` அறிமுகம்
NewType
ஏற்கனவே உள்ளவற்றிலிருந்து தனித்துவமான, பெயரளவு வகைகளை உருவாக்க உங்களை அனுமதிப்பதன் மூலம் இந்த சிக்கலை தீர்க்கிறது. இந்த புதிய வகைகள் நிலையான வகை சரிபார்ப்புகளால் தனித்துவமானதாக கருதப்படுகின்றன, ஆனால் இயக்க நேர சுமை பூஜ்ஜியமாக உள்ளது - இயக்க நேரத்தில், அவை அவற்றின் அடிப்படை வகையைப் போலவே செயல்படுகின்றன.
NewType
ஐப் பயன்படுத்தி எங்கள் எடுத்துக்காட்டை மறுசீரமைப்போம்:
from typing import NewType
# Define distinct types for User IDs and Order IDs
UserId = NewType('UserId', int)
OrderId = NewType('OrderId', int)
def process_order(user_id: UserId, order_id: OrderId) -> None:
print(f"Processing order {order_id} for user {user_id}...")
user_identification = UserId(101)
order_identification = OrderId(4512)
# Correct usage - works perfectly
process_order(user_identification, order_identification)
# Incorrect usage - now caught by a static type checker!
# Mypy will raise an error like:
# error: Argument 1 to "process_order" has incompatible type "OrderId"; expected "UserId"
# error: Argument 2 to "process_order" has incompatible type "UserId"; expected "OrderId"
process_order(order_identification, user_identification)
NewType
மூலம், UserId
மற்றும் OrderId
ஒன்றுக்கொன்று மாற்ற முடியாது என்று வகை சரிபார்ப்பாளரிடம் கூறியுள்ளோம், அவை இரண்டும் அவற்றின் மையத்தில் முழு எண்களாக இருந்தாலும் கூட. இந்த எளிய மாற்றம் பாதுகாப்பின் சக்திவாய்ந்த அடுக்கைச் சேர்க்கிறது.
`NewType` vs. `TypeAlias`
NewType
ஐ ஒரு எளிய வகை மாற்றுப்பெயரிலிருந்து வேறுபடுத்துவது முக்கியம். ஒரு வகை மாற்றுப்பெயர் ஏற்கனவே உள்ள வகைக்கு ஒரு புதிய பெயரை வழங்குகிறது, ஆனால் ஒரு தனித்துவமான வகையை உருவாக்காது:
from typing import TypeAlias
# This is just an alias. A type checker sees UserIdAlias as exactly the same as int.
UserIdAlias: TypeAlias = int
def process_user(user_id: UserIdAlias) -> None:
...
# No error here, because UserIdAlias is just an int
process_user(123)
process_user(OrderId(999)) # OrderId is also an int at runtime
வகைகள் ஒன்றுக்கொன்று மாற்றக்கூடியதாக இருக்கும்போது, படிக்கக்கூடிய தன்மைக்காக `TypeAlias` ஐப் பயன்படுத்துங்கள் (எ.கா., `Vector = list[float]`). வகைகள் கருத்தியல் ரீதியாக வேறுபட்டவையாகவும், கலக்கப்படக்கூடாதவையாகவும் இருக்கும்போது பாதுகாப்பிற்காக `NewType` ஐப் பயன்படுத்தவும்.
டைப்வேர்: சக்திவாய்ந்த பொதுவான செயல்பாடுகள் மற்றும் வகுப்புகளுக்கான திறவுகோல்
அடிக்கடி, நாம் ஒரு வகை செயல்பாடுகளை எழுதுகிறோம் அல்லது வகுப்புகளை எழுதுகிறோம், அவை பல்வேறு வகைகளில் செயல்படும் வகையில் வடிவமைக்கப்பட்டுள்ளன, அதே நேரத்தில் அவற்றுக்கிடையேயான உறவுகளைப் பராமரிக்கின்றன. உதாரணமாக, ஒரு பட்டியலின் முதல் உறுப்பை வழங்கும் ஒரு செயல்பாடு, அது சரங்களின் பட்டியலைக் கொடுத்தால் ஒரு சரத்தையும், முழு எண்களின் பட்டியலைக் கொடுத்தால் ஒரு முழு எண்ணையும் திரும்பப் பெற வேண்டும்.
`Any` உடன் உள்ள சிக்கல்
ஒரு அப்பாவிக் அணுகுமுறை typing.Any
ஐப் பயன்படுத்தக்கூடும், இது அந்த மாறிக்கான வகை சரிபார்ப்பை திறம்பட முடக்குகிறது.
from typing import Any, List
def get_first_element_any(items: List[Any]) -> Any:
if items:
return items[0]
return None
numbers = [1, 2, 3]
first_num = get_first_element_any(numbers)
# What is the type of 'first_num'? The type checker only knows 'Any'.
# This means we lose autocompletion and type safety.
# (first_num.imag) # No static error, but a runtime AttributeError!
Any
ஐப் பயன்படுத்துவது நிலையான டைப்பிங்கின் நன்மைகளை தியாகம் செய்ய நம்மை கட்டாயப்படுத்துகிறது. வகை சரிபார்ப்பாளர் செயல்பாட்டிலிருந்து திரும்பிய மதிப்பைப் பற்றிய அனைத்து தகவல்களையும் இழக்கிறார்.
தீர்வு: `TypeVar` அறிமுகம்
ஒரு TypeVar
என்பது ஒரு வகையின் பிளேஸ்ஹோல்டராக செயல்படும் ஒரு சிறப்பு மாறி. இது செயல்பாட்டு வாதங்களின் வகைகள் மற்றும் அவற்றின் திரும்பும் மதிப்புகளுக்கு இடையிலான உறவுகளை அறிவிக்க அனுமதிக்கிறது. இது பைத்தானில் ஜெனரிக்ஸின் அடித்தளமாகும்.
TypeVar
ஐப் பயன்படுத்தி எங்கள் செயல்பாட்டை மீண்டும் எழுதுவோம்:
from typing import TypeVar, List, Optional
# Create a TypeVar. The string 'T' is a convention.
T = TypeVar('T')
def get_first_element(items: List[T]) -> Optional[T]:
if items:
return items[0]
return None
# --- Usage Examples ---
# Example 1: List of integers
numbers = [10, 20, 30]
first_num = get_first_element(numbers)
# Mypy correctly infers that 'first_num' is of type 'Optional[int]'
# Example 2: List of strings
names = ["Alice", "Bob", "Charlie"]
first_name = get_first_element(names)
# Mypy correctly infers that 'first_name' is of type 'Optional[str]'
# Now, the type checker can help us!
if first_num is not None:
print(first_num + 5) # OK, it's an int!
if first_name is not None:
print(first_name.upper()) # OK, it's a str!
உள்ளீட்டிலும் (List[T]
) வெளியீட்டிலும் (Optional[T]
) T
ஐப் பயன்படுத்துவதன் மூலம், நாங்கள் ஒரு இணைப்பை உருவாக்கியுள்ளோம். உள்ளீட்டுப் பட்டியலுக்கு T
என்ன வகையுடன் செயல்படுத்தப்பட்டாலும், அதே வகை செயல்பாட்டால் திரும்பப் பெறப்படும் என்பதை வகை சரிபார்ப்பாளர் புரிந்துகொள்கிறார். இது பொதுவான நிரலாக்கத்தின் சாராம்சம்.
பொதுவான வகுப்புகள்
பொதுவான வகுப்புகளை உருவாக்குவதற்கும் TypeVar
அவசியம். இதைச் செய்ய, உங்கள் வகுப்பு typing.Generic
இலிருந்து மரபுரிமையாகப் பெற வேண்டும்.
from typing import TypeVar, Generic, List
T = TypeVar('T')
class Stack(Generic[T]):
def __init__(self) -> None:
self._items: List[T] = []
def push(self, item: T) -> None:
self._items.append(item)
def pop(self) -> T:
return self._items.pop()
def is_empty(self) -> bool:
return not self._items
# Create a stack specifically for integers
int_stack = Stack[int]()
int_stack.push(10)
int_stack.push(20)
value = int_stack.pop() # 'value' is correctly inferred as 'int'
# int_stack.push("hello") # Mypy error: Expected 'int', got 'str'
# Create a stack specifically for strings
str_stack = Stack[str]()
str_stack.push("hello")
# str_stack.push(123) # Mypy error: Expected 'str', got 'int'
ஜெனரிக்ஸை மேலும் எடுத்துச் செல்வது: `TypeVar` இல் உள்ள தடைகள்
ஒரு கட்டுப்படுத்தப்படாத TypeVar
எந்த வகையையும் குறிக்கலாம், இது சக்தி வாய்ந்தது ஆனால் சில நேரங்களில் மிகவும் அனுமதிக்கும். எங்கள் பொதுவான செயல்பாடு கூட்டல், ஒப்பீடு அல்லது அதன் உள்ளீடுகளில் ஒரு குறிப்பிட்ட முறையை அழைப்பது போன்ற செயல்பாடுகளைச் செய்ய வேண்டுமானால் என்ன செய்வது? கொடுக்கப்பட்ட வகை T
அந்த செயல்பாடுகளுக்கு ஆதரவளிக்கும் என்று வகை சரிபார்ப்பாளருக்கு எந்த உத்தரவாதமும் இல்லாததால், கட்டுப்படுத்தப்படாத TypeVar
வேலை செய்யாது.
இங்கே தடைகள் வருகின்றன. அவை ஒரு TypeVar
பிரதிநிதித்துவப்படுத்தக்கூடிய வகைகளைக் கட்டுப்படுத்த அனுமதிக்கின்றன.
தடை வகை 1: `bound`
ஒரு `bound` TypeVar
க்கு மேல் எல்லையை குறிப்பிடுகிறது. இதன் பொருள் TypeVar
என்பது பிணைக்கப்பட்ட வகையாகவோ அல்லது அதன் துணை வகைகளில் ஒன்றாகவோ இருக்கலாம். ஒரு குறிப்பிட்ட அடிப்படை வகுப்பின் முறைகள் மற்றும் பண்புகளை வகை ஆதரிக்க வேண்டும் என்பதை உறுதி செய்ய வேண்டியிருக்கும் போது இது பயனுள்ளதாக இருக்கும்.
இரண்டு ஒப்பிடக்கூடிய உருப்படிகளில் பெரியதைக் கண்டுபிடிக்கும் ஒரு செயல்பாட்டைக் கவனியுங்கள். `>` ஆபரேட்டர் எல்லா வகைகளுக்கும் வரையறுக்கப்படவில்லை.
from typing import TypeVar
# This version causes a type error!
T = TypeVar('T')
def find_larger(a: T, b: T) -> T:
# Mypy error: Unsupported operand types for > ("T" and "T")
return a if a > b else b
ஒரு `bound` ஐப் பயன்படுத்தி இதை சரிசெய்யலாம். int
மற்றும் float
போன்ற எண் வகைகள் ஒப்பீட்டை ஆதரிப்பதால், `float` ஐ ஒரு பிணைப்பாகப் பயன்படுத்தலாம் (`int` என்பது தட்டச்சு உலகில் `float` இன் துணை வகையாகும்).
from typing import TypeVar
# Create a bounded TypeVar
Number = TypeVar('Number', bound=float)
def find_larger(a: Number, b: Number) -> Number:
# This is now type-safe! The checker knows 'Number' supports '>'
return a if a > b else b
find_larger(10, 20) # OK, T is int
find_larger(3.14, 1.618) # OK, T is float
# find_larger("a", "b") # Mypy error: Type 'str' is not a subtype of 'float'
`bound=float` என்பது வகை சரிபார்ப்பாளருக்கு Number
க்கு மாற்றப்பட்ட எந்த வகையும் ஒப்பீட்டு ஆபரேட்டர்கள் உட்பட `float` இன் முறைகள் மற்றும் நடத்தைகளைக் கொண்டிருக்கும் என்று உத்தரவாதம் அளிக்கிறது.
தடை வகை 2: மதிப்பு தடைகள்
சில நேரங்களில், நீங்கள் ஒரு `TypeVar` ஐ ஒரு வகுப்பு வரிசைக்கு கட்டுப்படுத்த விரும்பவில்லை, ஆனால் ஒரு குறிப்பிட்ட, சாத்தியமான வகைகளின் எண்ணப்பட்ட பட்டியலுக்கு கட்டுப்படுத்த விரும்புகிறீர்கள். இதற்கு, நீங்கள் பல வகைகளை நேரடியாக `TypeVar` கன்ஸ்ட்ரக்டருக்கு அனுப்பலாம்.
str
அல்லது bytes
ஐ மட்டுமே செயல்படுத்தக்கூடிய ஒரு செயல்பாட்டை கற்பனை செய்து பாருங்கள். `bound` இங்கு பொருத்தமானதல்ல, ஏனெனில் `str` மற்றும் `bytes` எங்கள் நோக்கங்களுக்காக ஒரு வசதியான, குறிப்பிட்ட அடிப்படை வகுப்பைப் பகிர்ந்து கொள்ளவில்லை.
from typing import TypeVar
# Create a TypeVar constrained to 'str' and 'bytes'
StrOrBytes = TypeVar('StrOrBytes', str, bytes)
def get_hash(data: StrOrBytes) -> int:
# Both str and bytes have an __hash__ method, so this is safe.
return hash(data)
get_hash("hello world") # OK, StrOrBytes is str
get_hash(b"hello world") # OK, StrOrBytes is bytes
# get_hash(123) # Mypy error: Value of type variable "StrOrBytes" of "get_hash"
# # cannot be "int"
இது `bound` ஐ விட துல்லியமானது. `StrOrBytes` என்பது *சரியாக* `str` அல்லது `bytes` ஆக இருக்க வேண்டும் என்று வகை சரிபார்ப்பாளரிடம் கூறுகிறது, சில பொதுவான மூதாதையரின் துணை வகை அல்ல.
அனைத்தையும் ஒன்றாக இணைத்தல்: ஒரு நடைமுறை சூழ்நிலை
ஒரு சிறிய, வகை-பாதுகாப்பான தரவு செயலாக்க பயன்பாட்டை உருவாக்க இந்தக் கருத்துகளை இணைப்போம். ஒரு உருப்படிகளின் பட்டியலை எடுத்து, ஒவ்வொன்றிலிருந்தும் ஒரு குறிப்பிட்ட பண்புக்கூறை பிரித்தெடுத்து, அந்த பண்புக்கூறின் தனிப்பட்ட மதிப்புகளை மட்டும் திருப்பித் தரும் ஒரு செயல்பாட்டை உருவாக்குவதே எங்கள் குறிக்கோள்.
import dataclasses
from typing import TypeVar, List, Set, Hashable, NewType
# 1. Use NewType for semantic clarity
ProductId = NewType('ProductId', int)
# 2. Define a data structure
@dataclasses.dataclass
class Product:
id: ProductId
name: str
category: str
# 3. Use a bounded TypeVar. The attribute we extract must be hashable
# to be put into a set for uniqueness.
HashableValue = TypeVar('HashableValue', bound=Hashable)
def get_unique_attributes(items: List[Product], attribute_name: str) -> Set[HashableValue]:
"""Extracts a unique set of attribute values from a list of products."""
unique_values: Set[HashableValue] = set()
for item in items:
value = getattr(item, attribute_name)
# A static checker can't verify 'value' is HashableValue here without
# more complex plugins, but the bound documents our intent and helps consumers.
unique_values.add(value)
return unique_values
# --- Usage ---
products = [
Product(id=ProductId(1), name="Laptop", category="Electronics"),
Product(id=ProductId(2), name="Mouse", category="Electronics"),
Product(id=ProductId(3), name="Desk Chair", category="Furniture"),
]
# Get unique categories. The type checker knows the return is Set[str]
unique_categories: Set[str] = get_unique_attributes(products, 'category')
print(f"Unique Categories: {unique_categories}")
# Get unique product IDs. The return is Set[ProductId]
unique_ids: Set[ProductId] = get_unique_attributes(products, 'id')
print(f"Unique IDs: {unique_ids}")
இந்த எடுத்துக்காட்டில்:
NewType
நமக்குProductId
ஐ வழங்குகிறது, இது மற்ற முழு எண்களுடன் தற்செயலாக கலக்கப்படுவதைத் தடுக்கிறது.TypeVar('...', bound=Hashable)
நாம் பிரித்தெடுக்கும் பண்பு ஹேஷபிளாக இருக்க வேண்டும் என்ற முக்கியமான தேவையை ஆவணப்படுத்துகிறது மற்றும் செயல்படுத்துகிறது, ஏனெனில் அதை ஒருSet
இல் சேர்க்கிறோம்.- செயல்பாட்டின் கையொப்பம்
-> Set[HashableValue]
, பொதுவானதாக இருந்தாலும், செயல்பாட்டின் நடத்தை பற்றி டெவலப்பர்கள் மற்றும் கருவிகளுக்கு ஒரு வலுவான குறிப்பை வழங்குகிறது.
முடிவு: மனிதர்களுக்கும் இயந்திரங்களுக்கும் வேலை செய்யும் குறியீட்டை எழுதுங்கள்
பைத்தானின் டைப்பிங் அமைப்பு உயர்தர மென்பொருளுக்கான தேடலில் ஒரு சக்திவாய்ந்த நட்பு. அடிப்படைகளைத் தாண்டி NewType
, TypeVar
மற்றும் பொதுவான தடைகள் போன்ற கருவிகளை ஏற்றுக்கொள்வதன் மூலம், நீங்கள் கணிசமாக பாதுகாப்பான, புரிந்துகொள்ள எளிதான மற்றும் பராமரிக்க எளிதான குறியீட்டை எழுதலாம்.
- பழமையான வகைகளுக்கு சொற்பொருள் பொருளைக் கொடுக்கவும், வெவ்வேறு கருத்துக்களை கலப்பதில் இருந்து தர்க்கரீதியான பிழைகளைத் தடுக்கவும் `NewType` ஐப் பயன்படுத்தவும்.
- வகை தகவலைப் பாதுகாக்கும் நெகிழ்வான, மீண்டும் பயன்படுத்தக்கூடிய பொதுவான செயல்பாடுகள் மற்றும் வகுப்புகளை உருவாக்க `TypeVar` ஐப் பயன்படுத்தவும்.
- உங்கள் பொதுவான வகைகளில் தேவைகளைச் செயல்படுத்த
TypeVar
இல் `bound` மற்றும் மதிப்பு தடைகளைப் பயன்படுத்தவும், அவை நீங்கள் செய்ய வேண்டிய செயல்பாடுகளை ஆதரிப்பதை உறுதிசெய்கிறது.
இந்த வடிவங்களை ஏற்றுக்கொள்வது ஆரம்பத்தில் கூடுதல் வேலை போல் தோன்றலாம், ஆனால் குறைக்கப்பட்ட பிழைகள், மேம்படுத்தப்பட்ட ஒத்துழைப்பு மற்றும் மேம்படுத்தப்பட்ட டெவலப்பர் உற்பத்தித்திறன் ஆகியவற்றில் நீண்ட கால வெகுமதி அதிகம். இன்று உங்கள் திட்டங்களில் அவற்றை இணைக்கத் தொடங்குங்கள் மற்றும் மிகவும் வலுவான மற்றும் தொழில்முறை பைத்தான் பயன்பாடுகளுக்கான அடித்தளத்தை உருவாக்குங்கள்.